﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Common;
using BoletoElectronicoDesktop;
using BusinessLayer;
using BoletoElectronicoDesktop.AbmPost_Net;

namespace BoletoElectronicoDesktop.AbmBeneficiarios
{

    public partial class FormAbmBeneficarios : FormAddModify
    {
        FormAddModify.CallType uso;
        dsBoleto.PostnetDataTable dtPostnet;
        int idBeneficiario;
        String rzBeneficiarioToModify;

        public FormAbmBeneficarios(dsBoleto.BeneficiarioRow beneficiario, Util.Funcionalidad use): base(use)
        {
            InitializeComponent();
            determinarAccion(use);
            incicializarFormulario(beneficiario);
        }

        private void incicializarFormulario(dsBoleto.BeneficiarioRow beneficiario)
        {
            cargarRubros();
            dtPostnet = new dsBoleto.PostnetDataTable();
            dgvPostSelected.DataSource = dtPostnet;

            switch (this.uso)
            {
                case FormAddModify.CallType.Modify:
                    loadUser(beneficiario);
                    break;
                default:
                    break;
            }
        }

        private void cargarRubros()
        {
            cbRubro.DataSource = BizRubro.getRubros();
            cbRubro.SelectedItem = null;
        }

        private void loadUser(dsBoleto.BeneficiarioRow beneficiario)
        {
            dtPostnet = BizPostnet.getPostNetByBeneficiario(beneficiario.IdBeneficiario);
            dgvPostSelected.DataSource = dtPostnet;

            txtRazonSoc.Text = beneficiario.RazonSocial;
            txtCalle.Text = beneficiario.DirCalle;
            txtDepto.Text = beneficiario.DirDepto;
            txtNumero.Text = Convert.ToString(beneficiario.DirNro);
            txtPiso.Text = Convert.ToString(beneficiario.DirPiso);
            cbRubro.SelectedValue = beneficiario.IdRubro;

            rzBeneficiarioToModify = beneficiario.RazonSocial;
            idBeneficiario = beneficiario.IdBeneficiario;
        }

        private void determinarAccion(Util.Funcionalidad use)
        {
            if (Util.Funcionalidad.BeneficiarioAlta.Equals(use))
            {
                uso = FormAddModify.CallType.Add;
            }
            else
            {
                uso = FormAddModify.CallType.Modify;
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Dispose();
            Close();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            FormPrincipal frm = ((FormPrincipal)this.MdiParent);

            if (varlidarCamposObligatorios())
            {
                switch (uso)
                {
                    case BoletoElectronicoDesktop.FormAddModify.CallType.Add:
                        createNewBeneficiario();
                        actualizarFormularioInvocador(frm);
                        break;
                    case BoletoElectronicoDesktop.FormAddModify.CallType.Modify:
                        updateCurrentRol();
                        actualizarFormularioInvocador(frm);
                        break;
                    default:
                        break;
                }
            }
        }

        private void updateCurrentRol()
        {
            List<int> listPostnets = getListPostnet(dtPostnet);

            String razonSocial = txtRazonSoc.Text.ToString();

            int idRubro = 0;
            if (cbRubro.SelectedItem != null)
                idRubro = Convert.ToInt32(cbRubro.SelectedValue.ToString());

            String calle = txtCalle.Text.ToString();

            int numero = 0;
            if (!String.IsNullOrEmpty(txtNumero.Text))
                numero = Convert.ToInt32(txtNumero.Text);

            int piso = 0;
            if (!String.IsNullOrEmpty(txtPiso.Text))
                piso = Convert.ToInt32(txtPiso.Text);

            String depto = txtDepto.Text;

            bool created =
                BizBeneficiario.updateBeneficiario(idBeneficiario, razonSocial, idRubro, calle, numero, piso, depto, listPostnets);

            if (created)
            {
                MessageBox.Show("Se modificó exitosamente.", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Close();
            }
            else
            {
                MessageBox.Show("Ya Existe un beneficiario con ese nombre.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Close();
            }
        }

        private void createNewBeneficiario()
        {
            List<int> listPostnets = getListPostnet(dtPostnet);

            String razonSocial = txtRazonSoc.Text.ToString();

            int idRubro = 0;
            if (cbRubro.SelectedItem != null)
                idRubro = Convert.ToInt32(cbRubro.SelectedValue.ToString());

            String calle = txtCalle.Text.ToString();

            int numero = 0;
            if (!String.IsNullOrEmpty(txtNumero.Text))
                numero = Convert.ToInt32(txtNumero.Text);

            int piso = 0;
            if (!String.IsNullOrEmpty(txtPiso.Text))
                piso = Convert.ToInt32(txtPiso.Text);

            String depto = txtDepto.Text;

            bool created =
                BizBeneficiario.createNewBeneficiario(razonSocial, idRubro, calle, numero, piso, depto, listPostnets);

            if (created)
            {
                MessageBox.Show("Se guardo exitosamente.", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Close();
            }
            else
            {
                MessageBox.Show("Ya Existe un beneficiario con ese nombre.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Close();
            }
        }

        private List<int> getListPostnet(dsBoleto.PostnetDataTable dtPostnet)
        {
            List<int> postnets = new List<int>();
            foreach (dsBoleto.PostnetRow row in dtPostnet.Rows)
            {
                postnets.Add(row.IdPostnet);
            }
            return postnets;
        }

        private void actualizarFormularioInvocador(FormPrincipal form)
        {
            if (form.MdiChildren.Any(f => f is FormBeneficiariosList))
            {
                FormBeneficiariosList frm = (FormBeneficiariosList)form.MdiChildren.First(f => f is FormBeneficiariosList);
                frm.btnBuscar_Click(new Object(), new EventArgs());
            }
        }

        private bool varlidarCamposObligatorios()
        {
            bool valido = true;
            StringBuilder sb = new StringBuilder();

            valido = vaidarCampoRazonSocial(sb);
            if (!valido)
            {
                sb.AppendLine("Ya existe un beneficiario con el nombre Ingresado");
            }

            if (cbRubro.SelectedItem == null)
            {
                valido = false;
                sb.AppendLine("El campo Rubro es obligatorio.");
            }
            if (String.IsNullOrEmpty(txtCalle.Text))
            {
                valido = false;
                sb.AppendLine("El campo Calle es obligatorio.");
            }
            if (String.IsNullOrEmpty(txtNumero.Text))
            {
                valido = false;
                sb.AppendLine("El campo Número es obligatorio.");
            }
            if (dtPostnet.Count == 0)
            {
                valido = false;
                sb.AppendLine("Debe Seleccionar al menos un postnet");
            }
            if (!valido)
            {
                MessageBox.Show(sb.ToString(0, sb.Length), "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            return valido;
        }

        private bool vaidarCampoRazonSocial(StringBuilder sb)
        {
            if (String.IsNullOrEmpty(txtRazonSoc.Text))
            {
                sb.AppendLine("El campo Razon Social es obligatorio.");
                return false;
            }
            else
            {
                if (FormAddModify.CallType.Modify.Equals(uso))
                {
                    if (rzBeneficiarioToModify.Equals(txtRazonSoc.Text))
                    {
                        return true;
                    }
                }
                return validarNuevoRazonSocial(txtRazonSoc.Text);
            }
        }

        private void btnSelectPN_Click(object sender, EventArgs e)
        {
            try
            {
                FormPostnetList frm;
                if (this.MdiParent.MdiChildren.Any(f => f is FormPostnetList))
                {
                    frm = (FormPostnetList)this.MdiParent.MdiChildren.First(f => f is FormPostnetList);
                }
                else
                {
                    List<int> idSelectedPostnet = getListIdsSelectedPostnet();
                    frm = new FormPostnetList(Util.Funcionalidad.PostNetSelectMany);
                    frm.setPostnetsToIgnore(idSelectedPostnet);
                    frm.btnBuscar_Click(new Object(), new EventArgs());
                    frm.MdiParent = this.MdiParent;
                }

                frm.Show();
            }
            catch (ApplicationException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private List<int> getListIdsSelectedPostnet()
        {
            List<int> list = new List<int>();
            foreach (dsBoleto.PostnetRow row in dtPostnet.Rows)
            {
                list.Add(row.IdPostnet);
            }
            
            if (list.Count == 0)
            {
                list.Add(0);
            }
            return list;
        }

        internal void setPostNetSelected(List<DataGridViewRow> selectedList)
        {
            foreach (DataGridViewRow dgv in selectedList)
            {
                dsBoleto.PostnetRow row = dtPostnet.NewPostnetRow();
                row.IdPostnet = (int)dgv.Cells[0].Value;
                row.Marca = (String)dgv.Cells[1].Value;
                row.Modelo = (String)dgv.Cells[2].Value;
                dtPostnet.AddPostnetRow(row);
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            List<dsBoleto.PostnetRow> selectedList = new List<dsBoleto.PostnetRow>();

            foreach (DataGridViewRow row in dgvPostSelected.Rows)
            {
                DataGridViewCheckBoxCell cb = row.Cells[3] as DataGridViewCheckBoxCell;
                if (Convert.ToBoolean(cb.Value))
                {
                    dsBoleto.PostnetRow br = (dsBoleto.PostnetRow)((DataRowView)row.DataBoundItem).Row;
                    selectedList.Add(br);
                }
            }

            foreach (dsBoleto.PostnetRow row in selectedList)
            {
                dtPostnet.RemovePostnetRow(row);
            }
        }

        private bool validarNuevoRazonSocial(String razonSocial)
        {
            bool exist = BizBeneficiario.existRazonSocial(razonSocial);
            if (exist)
            {
                lblEstadoRZ.Text = "Ya existe un beneficiario con el nombre Ingresado";
                return false;
            }
            else
            {
                lblEstadoRZ.Text = "El nombre ingresado está disponible";
                return true;
            }
        }

        private void btnVerificarRZ_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(txtRazonSoc.Text))
            {
                validarNuevoRazonSocial(txtRazonSoc.Text);
            }
        }

        private void txtNumerico_KeyPress(object sender, KeyPressEventArgs e)
        {
            Util.limitarCampoNumericoEntero(e);
        }

        private void txtTexto_KeyPress(object sender, KeyPressEventArgs e)
        {
            Util.limitarCampoTexto(e);
        }
    }
}
